class FIFO {
    constructor(memorySize) {
        this.memorySize = memorySize;  // 内存的容量
        this.memory = [];                // 存储当前在内存中的页面
        this.pageFaults = 0;             // 缺页次数
        this.totalAccesses = 0;          // 页面访问总次数
    }

    // 访问页面
    accessPage(page) {
        console.log(`访问页面: ${page}`);
        this.totalAccesses++; // 增加访问总次数

        // 检查页面是否在内存中
        if (!this.memory.includes(page)) {
            // 页面不在内存中，发生缺页
            console.log(`发生缺页: ${page}`);
            this.pageFaults++; // 增加缺页次数

            // 如果内存已满，淘汰最早进入内存的页面
            if (this.memory.length >= this.memorySize) {
                const removedPage = this.memory.shift(); // 淘汰页面
                console.log(`移除页面: ${removedPage}`);
            }

            this.memory.push(page);  // 加载新页面
            console.log(`加载页面: ${page}`);
        } else {
            console.log(`页面 ${page} 已在内存中。`);
        }

        // 更新缺页率
        const pageFaultRate = this.pageFaults / this.totalAccesses; // 修正缺页率的计算
        this.printStatus(pageFaultRate);
    }

    // 打印当前内存状态和统计信息
    printStatus(pageFaultRate) {
        console.log(`当前内存: [${this.memory.join(', ')}]`);
        console.log(`缺页次数: ${this.pageFaults}`);
        console.log(`缺页率: ${(pageFaultRate * 100).toFixed(2)}%`);
        console.log('-----------------------------------');
    }
}

// 测试 FIFO 页面置换算法
const fifo = new FIFO(4); // 假设内存容量为 3 页
const pageReferences = [4,3,2,1,4,3,5,4,3,2,1,5];

pageReferences.forEach(page => {
    fifo.accessPage(page);
});
